package com.matrix.api.merchant;

import com.matrix.api.merchant.dto.*;
import com.matrix.api.merchant.vo.MerchantApplicationVO;
import com.matrix.api.merchant.vo.ShopBriefInfoVO;
import com.matrix.api.merchant.vo.ShopDetailVO;
import com.matrix.api.merchant.vo.ShopInfoVO;
import com.matrix.common.domain.PageResult;

import java.math.BigDecimal;
import java.util.Map;

/**
 * @author 有点甜
 * @since 2025/7/26
 */
public interface MerchantApi {

    /**
     * 分页查询商家入驻申请列表
     *
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @return 分页结果
     */
    PageResult<MerchantApplicationVO> getApplicationsByPage(int pageNum, int pageSize);

    /**
     * 审核商家入驻申请
     *
     * @param reviewDTO 审核数据
     */
    void reviewApplication(MerchantReviewDTO reviewDTO);

    /**
     * 根据商家用户ID获取其店铺信息
     *
     * @param userId 商家用户ID
     * @return 店铺基本信息VO，如果不存在则返回 null
     */
    ShopInfoVO getShopInfoByUserId(Long userId);

    /**
     * 根据ShopID获取店铺详细信息
     *
     * @param shopId 店铺ID
     * @return 店铺详细信息VO
     */
    ShopDetailVO getShopDetailsInternal(Long shopId);

    /**
     * 检查桌位是否可用
     *
     * @param shopId   店铺ID
     * @param areaSeat 区域和座位号, 格式 "区域-座位号"
     * @return true 如果可用
     */
    boolean checkTableAvailability(Long shopId, String areaSeat);

    /**
     * 占用桌位
     *
     * @param shopId   店铺ID
     * @param areaSeat 区域和座位号
     * @param orderId  关联的订单ID
     */
    void occupyTable(Long shopId, String areaSeat, Long orderId);

    /**
     * 标记桌位为“待清理”
     *
     * @param shopId   店铺ID
     * @param areaSeat 区域和座位号
     */
    void markTableForCleanUp(Long shopId, String areaSeat);

    /**
     * 分页查询商家(店铺)列表
     *
     * @param pageNum    页码
     * @param pageSize   每页数量
     * @param shopName   店铺名称
     * @param ownerPhone 店主手机号
     * @return 分页的店铺简要信息
     */
    PageResult<ShopBriefInfoVO> listMerchantsByPage(int pageNum, int pageSize, String shopName, String ownerPhone);

    /**
     * 更新店铺状态
     *
     * @param shopId 要更新的店铺ID
     * @param status 新的状态 (1-营业, 0-打烊/禁用)
     */
    void updateShopStatus(Long shopId, Integer status);

    /**
     * 更新店铺的各项评分
     *
     * @param shopId     店铺ID
     * @param ratingsMap 包含评分项和分值的Map
     */
    void updateShopRatings(Long shopId, Map<String, BigDecimal> ratingsMap);

    /**
     * 批量更新店铺的月销量
     * @param salesMap Key为shopId, Value为新的月销量
     */
    void batchUpdateMonthlySales(Map<Long, Integer> salesMap);

}